package main

import (
	"fmt"
	"reflect"
)

// 编写一个函数printMethod(s interface{})来遍历打印s包含的方法

type student struct {
	Name string
}

func (s student) Study() {
	msg := "好好学习，天天向上。"
	fmt.Println(s.Name,msg)
}

func (s student) Sleep() {
	msg := "好好睡觉，快快长大。"
	fmt.Println(s.Name,msg)
}

func printMethod(x interface{}) {
	t := reflect.TypeOf(x)
	v := reflect.ValueOf(x)
	fmt.Println(t.NumMethod())
	for i := 0; i < v.NumMethod(); i++ {
		methodType := v.Method(i).Type()
		fmt.Printf("method name:%s\n", t.Method(i).Name)
		fmt.Printf("method:%s\n", methodType)
		// 通过反射调用方法传递的参数必须是 []reflect.Value 类型
		var args = []reflect.Value{}
		v.Method(i).Call(args)
	}
}

func main() {

	x := student{Name: "小小"}
	printMethod(x)
}
